#!/bin/sh
###########################################################################
##                                                                       ##
##                  Language Technologies Institute                      ##
##                     Carnegie Mellon University                        ##
##                         Copyright (c) 2016                            ##
##                        All Rights Reserved.                           ##
##                                                                       ##
##  Permission is hereby granted, free of charge, to use and distribute  ##
##  this software and its documentation without restriction, including   ##
##  without limitation the rights to use, copy, modify, merge, publish,  ##
##  distribute, sublicense, and/or sell copies of this work, and to      ##
##  permit persons to whom this work is furnished to do so, subject to   ##
##  the following conditions:                                            ##
##   1. The code must retain the above copyright notice, this list of    ##
##      conditions and the following disclaimer.                         ##
##   2. Any modifications must be clearly marked as such.                ##
##   3. Original authors' names are not deleted.                         ##
##   4. The authors' names are not used to endorse or promote products   ##
##      derived from this software without specific prior written        ##
##      permission.                                                      ##
##                                                                       ##
##  CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK         ##
##  DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING      ##
##  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT   ##
##  SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE      ##
##  FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES    ##
##  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN   ##
##  AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,          ##
##  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF       ##
##  THIS SOFTWARE.                                                       ##
##                                                                       ##
###########################################################################
##                                                                       ##
##  Run tests for flite front ends                                       ##
##                                                                       ##
##  flitechecks VOICE.flitechecks tests/tamil.flitecheck                 ##
##                                                                       ##
###########################################################################

LANG=C; export LANG

if [ $# != 2 ]
then
    echo "flitecheck VOICE.flitevox [TESTFILE.flitecheck]"
    echo "if TESTFILE.flitecheck isn't give it will guess one from the library"
    exit 1
fi

FLITE=$FLITEDIR/bin/flite
VOICE=$1
FC=$2

rm -f test.out.$$

cat $2 |
while read x
do
   if [ "$x" = "INPUT" ]
   then
      read y 
      echo $y >fc.input.$$
   fi
   if [ "$x" = "OUTPUT" ]
   then
      read y
      echo $y >fc.output.$$
   fi
   if [ "$x" = "PARAMS" ]
   then
      read PARAMS
   fi
   if [ "$x" = "TEST" ]
   then
      read TESTNAME
      echo RUNNING TEST: $TESTNAME
   fi
   if [ "$x" = "DOIT" ]
   then
      echo TEST $TESTNAME >>fc.test.out.$$
      $FLITE -voice $VOICE $PARAMS -f fc.input.$$ none >fc.output.real.$$
      cat fc.input.$$ >>fc.test.out.$$
      cat fc.output.$$ >>fc.test.out.$$
      if diff -b fc.output.$$ fc.output.real.$$ >&2 >>fc.test.out.$$
      then
          echo TEST OKAY >>fc.test.out.$$
      else
          diff -b fc.output.$$ fc.output.real.$$
          echo TEST NOT OKAY >>fc.test.out.$$
      fi
   fi
done

#
#  Print out summary of tests
#
cat fc.test.out.$$ |
awk 'BEGIN { correct=0; total=0; wrong=0; }
     {if ($1 == "TEST")
      {
         if ($NF == "OKAY")
         {
            if ($2 == "NOT")
            {
               wrong = wrong+1;
               printf("FAILED: %s\n",testdescription);
            }
            else if ($2 == "OKAY")
            {
               correct = correct+1;
            }
         }
         else
         {
            total=total+1;
            testdescription = $0;
         }
       }}
     END {if (correct == total)
             printf("100%% correct ( %d / %d )\n",correct,total);
          else
          {
             printf("%0.2f%% wrong ( %d / %d )\n",(wrong*100.0)/total,wrong,total);
             printf("%0.2f%% correct ( %d / %d )\n",(correct*100.0)/total,correct,total);
          }}'

rm -f fc.input.$$ fc.output.$$ fc.test.out.$$ fc.output.real.$$
